package edu.uoc.tds.pec3.server;

import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
//import java.util.ArrayList;
import java.util.List;
import java.io.Serializable;


import edu.uoc.tds.pec3.beans.*;

import java.util.Date;

//import javax.swing.JOptionPane;

import edu.uoc.tds.pec3.common.GestorEstocInterface;
import edu.uoc.tds.pec3.i18n.TDSLanguageUtils;



/*********
 * Implementacion del servidor
 * 
 *********/

public class GestorEstocInterfaceImpl extends UnicastRemoteObject implements GestorEstocInterface, Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	GestorBD gestorBD = null;
	
	protected GestorEstocInterfaceImpl() throws RemoteException {
		super();

		try {
			gestorBD = new GestorBD();
			gestorBD.iniciarConexion();
		}catch (SQLException sqle) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.conexionFallida"))+ sqle.getMessage());
		} catch (Exception e) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.general"))+ e.getMessage());
		}	
	}

	@Override
	public List<Aula> getAulas() throws RemoteException {
		
        
        GestionStock gStock = new GestionStock(gestorBD.getConexion());
		
        List<Aula> lAulas = null;
		try {
			lAulas = gStock.listaAulas();
		}catch (SQLException sqle) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.errorAulas"))+ sqle.getMessage());
		} catch (Exception e) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.general"))+ e.getMessage());
		}

		return lAulas;
	}
	
	@Override
	public Aula getAula(int idAula) throws RemoteException {
        GestionStock gStock = new GestionStock(gestorBD.getConexion());	
        Aula aula = null;
		try {
			aula = gStock.getAula(idAula);
		}catch (SQLException sqle) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.errorAula"))+ sqle.getMessage());
		} catch (Exception e) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.general"))+ e.getMessage());
		}
		return aula;
	}	

	@Override
	public List<Recurso> getRecursos() throws RemoteException {
	
        
        GestionStock gStock = new GestionStock(gestorBD.getConexion());
		
        List<Recurso> lRecursos = null;
		try {
			lRecursos = gStock.listaRecursos();
		}catch (SQLException sqle) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.errorRecursos"))+ sqle.getMessage());
		} catch (Exception e) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.general"))+ e.getMessage());
	}

		return lRecursos;
	}
	
	@Override
	public Recurso getRecurso(int idRecurso) throws RemoteException {
        GestionStock gStock = new GestionStock(gestorBD.getConexion());	
        Recurso recurso = null;
		try {
			recurso = gStock.getRecurso(idRecurso);
		}catch (SQLException sqle) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.errorRecurso"))+ sqle.getMessage());
	} catch (Exception e) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.general"))+ e.getMessage());
	}
		return recurso;
	}	

	@Override
	public List<PeticionRecurso> getPeticionRecursos() throws RemoteException {
        GestionStock gStock = new GestionStock(gestorBD.getConexion());
		
        List<PeticionRecurso> lPetRecursos = null;
		try {
			lPetRecursos = gStock.listaPeticionRecursos();
		}catch (SQLException sqle) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.errorPeticion"))+ sqle.getMessage());
		} catch (Exception e) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.general"))+ e.getMessage());
	}
		return lPetRecursos;
	}

	@Override
	public String addRecurso(int id_recurso, int cantidad, Date fecha_entrada)
			throws RemoteException {
		String resultado = null;
		GestionStock gStock = new GestionStock(gestorBD.getConexion());
		try {
			resultado = gStock.actualizaRecurso(id_recurso, cantidad, fecha_entrada);
		} 
			catch (SQLException sqle) {
				throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.errorActualizarStock"))+ sqle.getMessage());
			} catch (Exception e) {
				throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.general"))+ e.getMessage());
			}
		// TODO Auto-generated method stub
		return resultado;
	}

	@Override
	public String addPeticionRecurso(int id_aula, int id_recurso, int cantidad) throws RemoteException {		
		String addPetRecursos = null; 
		GestionStock gStock = new GestionStock(gestorBD.getConexion());		
		int peticiones = 0;
		
			try {
				peticiones = gStock.peticionesAula(id_aula);
			} catch (Exception e1) {
				throw new RemoteException(e1.getMessage());
			}
		
		if (peticiones < 3) {
			 try{	
				addPetRecursos = gStock.insertarPeticionRecursos(id_aula, id_recurso, cantidad);
			}catch (SQLException sqle) {
				throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.errorIntentoInsercion"))+ sqle.getMessage());
			} catch (Exception e) {
				throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.general"))+ e.getMessage());
			}
		} else {				
				throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.errorMasTresAulas0"))+" "+ peticiones +" "+(TDSLanguageUtils.getMessage("mensaje.remoto.errorMasTresAulas1")));
			}
			
		return addPetRecursos;	//si es nulo significa que todo ha ido bien
	}

	@Override
	public void atenderPeticionRecurso(PeticionRecurso peticionRecurso)	throws RemoteException {	
		GestionStock gStock = new GestionStock(gestorBD.getConexion());	
		String fecha_salida = null;
		fecha_salida = getFechaActual();
		try {
			boolean deletePeticionRecursos = gStock.deletePeticionRecursos(
					peticionRecurso.getIdRecurso(), 
					peticionRecurso.getIdAula(), 
					peticionRecurso.getFechaAltaPeticion(),
					fecha_salida
				);
			
			if (deletePeticionRecursos) {
				
				descontarStock(peticionRecurso.getIdRecurso(), peticionRecurso.getCantidad(), deStringToDate(fecha_salida));
			}			
			
		}catch (SQLException sqle) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.errorIntentoPeticion"))+ sqle.getMessage());
		} catch (Exception e) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.general"))+ e.getMessage());
		}	
	}

	@Override
	public String descontarStock(int id_recurso, int cantidad, Date fecha_salida)
			throws RemoteException {
		String resultado = null;
		GestionStock gStock = new GestionStock(gestorBD.getConexion());
		try {
			resultado = gStock.descontarRecurso(id_recurso, cantidad, fecha_salida);
		}catch (SQLException sqle) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.errorIntentoDescuentoStock"))+ sqle.getMessage());
		} catch (Exception e) {
			throw new RemoteException((TDSLanguageUtils.getMessage("mensaje.remoto.general"))+ e.getMessage());
		}
		// TODO Auto-generated method stub
		return resultado;
		
	}

    public static String getFechaActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("yyyy-MM-dd");
        return formateador.format(ahora);
    }
	
    public static synchronized java.util.Date deStringToDate(String fecha) {
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
        Date fechaEnviar = null;
        try {
            fechaEnviar = formatoDelTexto.parse(fecha);
            return fechaEnviar;
        } catch (ParseException ex) {
            ex.printStackTrace();
            return null;
        }
    }
    
    
}